package club.gskj.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.redisson.spring.session.config.EnableRedissonHttpSession;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1.整合mybaits-plus
 * 1. 导入依赖
 * <dependency>
 * <groupId>com.baomidou</groupId>
 * <artifactId>mybatis-plus-boot-starter</artifactId>
 * <version>3.2.0</version>
 * </dependency>
 * 2. 配置
 * 1. 数据源
 * application.yml 配置数据库信息
 * 2. mybatis-plus相关信息
 * 1. 使用mapperScan
 * 2. 配置sql映射文件
 * <p>
 * 2. 逻辑删除
 * 1.  配置全局的逻辑删除规则(省略)
 * 2.  配置逻辑删除组件,Bean.(省略)
 * 3   实体类中加上 逻辑删除注解 @TableLogic
 * <p>
 * 3. 后台数据校验
 * JSR303校验 (javax.validation.constraints)
 * 1. 给Bean添加校验注解
 * 2. 自定义message提示
 * 3. 开启校验功能，在需要校验的controller中， @Valid
 * 4. 给校验的bean后，紧跟 BindingResult ，获取校验的结果
 * 5. 分组校验
 * 1.@NotBlank(message = "品牌名不能为空", groups = {AddGroup.class, UpdateGroup.class})
 * 给校验注解标什么情况下需要进行校验
 * 2.在controller方法参数中使用 ：@Validated({UpdateGroup.class})，指定校验情况，根据不同情况使用不同的分组校验规则。
 * 3. 默认没有指定分组的校验规则，在分组校验情况下不生效，也就说是只会在标注 @Validated下生效
 * 6. 自定义校验功能
 * 1. 编写自定义校验注解
 * 2. 编写自定义校验器  ConstraintValidator
 * 3. 关联自定义校验器和自定义校验注解 @Constraint(validatedBy = {ListValueConstraintValidator.class}【可以指定多个不同校验器，来适配不同的类型】)
 * <p>
 * 4. 统一异常处理
 *
 * @ControllerAdvice 标注类来处理 controller异常
 * @ExceptionHandler: 处理指定的异常
 * <p>
 * 5. 模板引擎
 * 1. thymeleaf-starter ：设置关闭缓存
 * 2. 姿态资源放到 static文件下，可直接访问
 * 3. 页面放在 templates文件下，可直接访问
 * springBoot默认访问项目时，默认会在templates中找 index.html
 * 4.页面修改内容，不重启服务自动刷新
 * <p>
 * 6. 整合redis
 * 1.引入 data-redis-starter
 * 2.简单配置redis的配置信息
 * 3.使用springBoot自动配置好的 redisTemplate
 * <p>
 * 7. 整合redisson来作为分布式锁等功能框架
 * 1. 引入依赖
 * <dependency>
 * <groupId>org.redisson</groupId>
 * <artifactId>redisson</artifactId>
 * <version>3.12.0</version>
 * </dependency>
 * 2. 编写配置 MyRedissonConfig 编码配置
 * <p>
 * 8. 整合springCache简化缓存开发
 * 1.引入依赖
 * spring-boot-starter-cache
 * spring-boot-starter-data-redis
 * <p>
 * 2.编写配置
 * 1. 自动配置了那些
 * CacheAutoConfiguration会导入 RedisCacheConfiguration;
 * 自动配好了 缓存管理器 RedisCacheManager
 * 2. 配置使用reids作为缓存
 * application.properties
 * 3.测试缓存注解
 * @Cacheable: 触发将数据保存到缓存
 * @CacheEvict：触发将数据从缓存中删除
 * @CachePut：不影响方法执行更行缓存
 * @Caching：组合以上多个缓存操作
 * @CacheConfig：在类级别共享缓存的配置 1. 开启缓存功能 @EnableCaching
 * 2.只需要使用注解就可以完成缓存操作
 * 4. 原理：
 * CacheAutoConfiguration -> RedisConfiguration -> 自动配置了 RedisChaheManager 初始化所有缓存 ->
 * 每个缓存决定使用什么配置 -> 判断？如果redisCachgeConfiguration有就用已有的配置，没有就用默认配置 ->
 * 想修改配置直接向容器中放一个 RedisChageConfiguration 配置即可。->
 * 最后就会引用到当前RedisCacheManager管理的所有缓存分区中。
 */
@EnableRedisHttpSession
@EnableFeignClients(basePackages = "club.gskj.gulimall.product.feign") // 开启远程调用接口,指定远程接口所在包
@EnableDiscoveryClient
@MapperScan("club.gskj.gulimall.product.dao")
@SpringBootApplication
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }
}
